A "legjobb" automount rendszer
A HupWiki-ből...
Az ivman és az autofs kombinációja. Az autofs tudja azt, hogy bizonyos idejű inaktivitás után automatikusan lecsatol. Ez megkímél attól a kényelmetlenségtől, hogy jelezni kelljen az eszköz használatának befejeztét (lecsatolás, szinkronizálás), ugyanakkor lehetővé teszi, hogy mindemellett az eszköz aszinkron legyen csatolva. A hátránya, hogy előre meg kell adni a konfigurációs fájlban az eszközöket, amiket automatikusan csatol. CD ill. floppy esetén ezzel nincs gond, de pendrive-oknál például már változhat. Itt jön képbe az ivman. Ez a HAL-lal van kapcsolatban, és automatikusan végre tud hajtani különféle parancsokat eszköz behelyezésénél és eltávolításánál. Na most az ivman nagyon rugalmas. Így én beállítottam, hogy eszköz behelyezésénél és eltávolításánál ő maga konfigurálja át a autofs-t.
Az eredmény:
- desktop environment független automount megoldás
- 0 mount, umount, sync
Tartalomjegyzék |
Hozzávalók
- autofs
- ivman
- sudo
Aki nem akar módosítani az én scriptjeimen, annak ntfs-3g is kell. Az alábbiak teljes megértéséhez szükséges a hozzávalók használatának ismerete.
autofs beállítása
A következő két sor legyen az /etc/auto.master fő konfigfájlban:
/media/.auto.static /etc/auto.static --timeout=3 /media/.auto.ivman /etc/auto.ivman --timeout=3
Az /etc/auto.static-ba mennek azok, amiknek statikus az eszközfájlja. Pl. cd, dvd, floppy. Nálam ez a következőképpen néz ki:
$ cat /etc/auto.static | grep -v '#' cdrom -fstype=iso9660,iocharset=iso8859-2,ro,nosuid,nodev :/dev/cdrom cdrom1 -fstype=auto,iocharset=iso8859-2,ro,nosuid,nodev :/dev/cdrom1 fd0 -fstype=auto,iocharset=iso8859-2,umask=000,quiet,rw,nosuid,nodev :/dev/fd0
Az /etc/auto.ivman tartalmát az ivman fogja állítani.
ivman scriptek
Kell két script, ami konfigurálja az autofs-t eszköz hozzáadásánál és eltávolításánál.
Az /etc/ivman/ivman-insert hozzáad egy új bejegyzés az auto.ivman fájlhoz. Első paramétere az eszközfájl, második a fájlrendszer.
#!/bin/bash BLOCK_DEV="$1" FSTYPE="$2" DEV_NAME="$(echo $BLOCK_DEV | cut -d '/' -f 3- | sed 's/\//_/g')" AUTO_IVMAN="/media/.ivman_dev_list" # Extended partíciót nem csatolok (arra a hal.volume.fstype üres sztring) if [ -z $FSTYPE ] ; then exit 0 ; fi # Swap partíciót nem csatolok if [ $FSTYPE = "swap" ] ; then exit 0 ; fi # A saját harddiskem levő cuccok ide nem kellenek, azok az fstab-ból jönnek if [ $(echo $BLOCK_DEV | grep '/dev/hda' | wc -l) = 1 ] ; then exit 0 ; fi case $FSTYPE in ext2|ext3|reiserfs|jfs|xfs) MOUNT_OPT="nodev,nosuid" ;; msdos|vfat) MOUNT_OPT="dmask=000,fmask=111,codepage=852,iocharset=iso8859-2,quiet,showexec" ;; ntfs) FSTYPE="ntfs-3g" MOUNT_OPT="dmask=000,fmask=111,locale=en_US.UTF8" # Ehhez kell ntfs-3g. Ha nincs, akkor ezt a részt módosítani kell. # MOUNT_OPT = "ro,nls=utf8,dmask=000,fmask=111" ;; *) FSTYPE="auto" MOUNT_OPT="nodev,nosuid" ;; esac # Új bejegyzés a konfigfájlba echo $DEV_NAME -fstype=$FSTYPE,$MOUNT_OPT :$BLOCK_DEV >> $AUTO_IVMAN # Létrehozzuk a /media/.auto.ivman-t, ha eddig nem volt mkdir -p /media/.auto.ivman # Újra olvastassuk a konfigfájlt sudo /usr/sbin/invoke-rc.d autofs reload >/dev/null 2>&1 # Létrehozzuk a linket (az autofs működési elve miatt jól jön) ln -s .auto.ivman/$DEV_NAME /media/$DEV_NAME echo "Device $DEV_NAME plugged in."
Az /etc/ivman/ivman-remove eltávolít egy bejegyzést az auto.ivman fájlból. Egyetlen paramétere az eszközfájl.
#!/bin/bash BLOCK_DEV="$1" DEV_NAME="$(echo $BLOCK_DEV | cut -d '/' -f 3- | sed 's/\//_/g')" AUTO_IVMAN="/media/.ivman_dev_list" # Eltávolítjuk a bejegyzést grep -v '$BLOCK_DEV' < $AUTO_IVMAN > $AUTO_IVMAN # Ha eszköz használatban volt és az autofs még nem csatolta le, # akkor tudatjuk a rendszerrel, hogy most már az eszköz nem elérhető sudo /sbin/umount -l $BLOCK_DEV >/dev/null 2>&1 # Létrehozzuk a /media/.auto.ivman-t, ha eddig nem volt mkdir -p /media/.auto.ivman # Újra olvastassuk a konfigfájlt sudo /usr/sbin/invoke-rc.d autofs reload >/dev/null 2>&1 # Eltávolítjuk a linket rm -f /media/$DEV_NAME echo "Device $DEV_NAME removed."
Az /etc/auto.ivman egy link a /media/.ivman_dev_list-re. Később meglátjuk miért kell ez. A sudo azért kell, mert ezek a scriptek az ivman felhasználó nevében fognak futni. Tehát az /etc/sudoers-be bele kell tenni a következő két sort:
ivman ALL=(root) NOPASSWD: /usr/sbin/invoke-rc.d autofs reload ivman ALL=(root) NOPASSWD: /sbin/umount -l /dev/*
Aki nem Debian alapú rendszert használ, annak az invoke-rc.d-t helyettesítenie kell valami azzal ekvivalenssel! Az /etc/auto.ivman egy link a /media/.ivman_dev_list-re.
ivman beállítása
Most beállítjuk az ivmant, hogy használja ezeket a scripteket.
$ cat /etc/ivman/IvmConfigActions.xml <?xml version="1.0" encoding="UTF-8"?> <ivm:ActionsConfig version="0.2" xmlns:ivm="http://www.eikke.com/ivm"> <!-- perform these rules on devices already attached when Ivman starts --> <ivm:Option name="checkOnInit" value="true" /> <!-- try to mount any mountable volume at all --> <!-- <ivm:Match name="ivm.mountable" value="true"> --> <ivm:Match name="hal.volume.is_mounted" value="false"> <ivm:Option name="exec" value="/etc/ivman/ivman-insert '$hal.block.device$' '$hal.volume.fstype$'" /> <ivm:Option name="execun" value="/etc/ivman/ivman-remove '$hal.block.device$'" /> </ivm:Match> </ivm:ActionsConfig>
Még csak annyi hiányzik, hogy kikapcsolás előtt, ha nem húzunk le valami cuccot, akkor megmarad az autofs-nek a bejegyzés, meg a linkek a /media-ban. Ezt a következőképp oldottam meg.
A /media-t tmpfs-re tettem, tehát egy sor az fstab-ba:
tmpfs /media tmpfs gid=plugdev,mode=775 0 0
Meg csináltam egy scriptet, ami a szükséges dolgokat indításnál beleteszi.
$ cat /etc/init.d/autofs-ivman-prepare #!/bin/bash ln -s .auto.static/cdrom /media/cdrom ln -s .auto.static/cdrom1 /media/dvd ln -s .auto.static/fd0 /media/floppy touch /media/.ivman_dev_list chown ivman /media/.ivman_dev_list mkdir /media/.auto.static
Ezt beraktam, hogy rendszerindításnál elinduljon.
$ ls -l /etc/rcS.d/S60autofs-ivman-prepare lrwxrwxrwx 1 root root 30 2007-02-03 16:00 /etc/rcS.d/S60autofs-ivman-prepare -> ../init.d/autofs-ivman-prepare
Kész.